﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json;

namespace IcbcOpenDemo.Models
{
    // 属性的大小写根据接口文档定义
    // 提交时API字段以JSON格式附在请求URL的bizconent参数中

    #region API请求类
    // API类派生于BaseAPI，可调用ToJsonString方法
    public class RequestQACCBAL : BaseAPI
    {
        const string TRANSCODE = "QACCBAL";
        const string BANKCODE="102";
        // 该API的地址,加上开放平台的地址组合成调用API的全路径
        private string PATH = "mybank/enterprise/account/qaccbal/V1";

        public override string GetPath()
        {
            return PATH;
        }

        #region 该接口的bizcontent部份，请将所有属性的类型都设置为string

        public string trans_code { get { return TRANSCODE; } } //交易代码，每个API都有一固定交易代码
        public string cis { get; set; } //集团CIS号,客户注册时的归属编码
        public string bank_code { get { return BANKCODE; } } //归属银行编号,客户注册时的归属单位 工行都是102
        public string login_id { get; set; } //证书ID,无证书客户可上送空
        public string tran_date { get; set; } //ERP系统产生的交易日期，格式是yyyyMMdd
        public string f_seq_no { get; set; } //ERP系统产生的指令包序列号，一个集团永远不能重复。客户可选择上送或由系统自动生成
        public string language { get; set; } //语言:zh_CN：简体中文，en_US：英文，默认zh_CN
        public string tran_time { get; set; } //ERP系统产生的交易时间，格式如HHmmssSSS，精确到毫秒
        public string total_num { get; set; } //查询账号数,需要查询的账号的个数，即提交包明细的笔数
        public List<RequestQACCBALRd> rd { get; set; }  // 可一次提交多笔的API都有请求的循环体rd
        #endregion
    }

    /// <summary>
    /// 部份API接口支持多笔，以循环体rd字段
    /// </summary>
    public class RequestQACCBALRd
    {
        public string i_seq_no { get; set; } //指令顺序号
        public string account_no { get; set; } //账号,对于本行FT类账户，支持账号前加FT类标志的上送。对于账户管家账号和安心账户，支持上送“主账号-子账号”格式。
        public string currency { get; set; } //币种，支持工行币种代码或国际标准币种代码（如CNY）,系统自动转换。不输入则自动取账号币种；账号为本行多币种账户时，必输
        public string sub_no { get; set; } //存款序号：境外定期，通知存款查询必输
        //行别,集团有他行账号时为必输项（输入102或不输入为工行，其他为他行）
        public string bank_type { get; set; }
    }
    #endregion

    #region API响应类，返回的JSON的response_biz_content字段内容

    public class ResponseQACCBAL
    {
        public response_biz_content response_biz_content { get; set; }
        public string sign { get; set; }
    }

    public class response_biz_content
    {
        public int return_code { get; set; } //返回码，交易成功返回0，正表示业务报错，负表示系统报错，负值时须考虑疑帐
        public string return_msg { get; set; } //返回码说明
        public string msg_id { get; set; } //消息号
        public string trans_code { get; set; } //交易代码
        public string cis { get; set; } //集团CIS号,客户注册时的归属编码
        public string bank_code { get; set; } //归属银行编号,客户注册时的归属单位
        public string login_id { get; set; } //证书ID,无证书客户可上送空
        public string tran_date { get; set; } //ERP系统产生的交易日期，格式是yyyyMMdd
        public string tran_time { get; set; } //ERP系统产生的交易时间，格式如HHmmssSSS，精确到毫秒
        public string f_seq_no { get; set; } //ERP系统产生的指令包序列号，一个集团永远不能重复。客户可选择上送或由系统自动生成
        public List<rd> rd { get; set; }
    }

    public class rd
    {
        public string i_seq_no { get; set; } //指令顺序号
        public string account_no { get; set; } //账号,对于本行FT类账户，支持账号前加FT类标志的输出；
        public string currency { get; set; } //币种，国际标准币种代码
        public int cash_exf { get; set; } //钞汇标志，0-钞;1-汇;2-假汇;3-境外汇款
        public int account_property { get; set; } //账户属性
        public int yesterday_balance { get; set; } //昨日余额，以币种的最小单位为单位，不带小数点；当币种为日元时，金额*100上送，例如：100代表1日元
        public int balance { get; set; } //当前余额，以币种的最小单位为单位，不带小数点；当币种为日元时，金额*100上送，例如：100代表1日元
        public int usable_balance { get; set; } //可用余额，以币种的最小单位为单位，不带小数点；当币种为日元时，金额*100上送，例如：100代表1日元
        public int frozen_amt { get; set; } //冻结额度合计，以币种的最小单位为单位，不带小数点；当币种为日元时，金额*100上送，例如：100代表1日元
        public string query_time { get; set; } //查询时间
        public string i_ret_code { get; set; } //明细交易返回码
        public string i_ret_msg { get; set; } //明细交易返回描述
        public string bank_type { get; set; } //行别
        public string account_name { get; set; } //账户名称
        public int hold_amt { get; set; } //保留余额，以币种的最小单位为单位，不带小数点；当币种为日元时，金额*100上送，例如：100代表1日元
        public string last_intr_date { get; set; } //最后计息日,yyyyMMdd(fova账号时返回空)
        public string sub_no { get; set; } //存款序号
        public string last_tran_date { get; set; } //最后交易日,yyyyMMdd
    }
    #endregion


}
